/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mattespill;
import java.util.*;
/**
 *
 * @author Andre
 */
public class TallGenerator {
    Calendar calendar = new GregorianCalendar();
    int[] seed = {2, 3, 5, 7, 11, 13, 19, 23, 29, 31, 37, 43, 47, 53, 59, 61, 67,
                    71, 79, 101, 107, 127, 131, 139, 149, 151, 157, 173, 181, 191,
                    197, 199, 211, 223, 229, 263, 269, 277, 283, 311, 317, 331, 347,
                    349, 863, 877, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997};
    Random randomGen = new Random(seed[calendar.get(Calendar.SECOND)]);
    
    public TallGenerator(){
    }
    
    public Regnestykke genererRegnestykke(int nivaa){
        switch (nivaa){
            case 1: return genererEnkelAddisjon();
            case 2: return genererEnkelSubtraksjon();
                
            case 3: return genererMiddelsAddisjon();
            case 4: return genererMiddelsSubtraksjon();
                
            case 5: return genererVanskeligAddisjon();
            case 6: return genererVanskeligSubtraksjon();
                
            case 7: return genererEnkelMultiplikasjon();
            case 8: return genererLettDivisjon();
                
            case 9: return genererMiddelsMultiplikasjon();
            case 10: return genererMiddelsDivisjon();
                
            case 11: return genererVanskeligMultiplikasjon();
            case 12: return genererVanskeligDivisjon();
            
            default: return genererRandomRegnestykke();
        }
    }
    
    public Regnestykke genererEnkelAddisjon(){
        Regnestykke a;
        ArrayList<Integer> tall = new ArrayList<Integer>();
        ArrayList<String> operator = new ArrayList<String>();
        operator.add("+");
        do{
            tall.clear();
            tall.add( randomGen.nextInt(6) );
            tall.add( randomGen.nextInt(6) );
            a = new Regnestykke(tall,operator);
        }while (a.regnUtResultat() > 10);
        return a;
    }
    
    public Regnestykke genererMiddelsAddisjon(){
        Regnestykke a;
        ArrayList<Integer> tall = new ArrayList<Integer>();
        ArrayList<String> operator = new ArrayList<String>();
        operator.add("+");
        do{
            tall.clear();
            tall.add( randomGen.nextInt(10)+1);
            tall.add( randomGen.nextInt(10)+1);
            a = new Regnestykke(tall,operator);
        }while (a.regnUtResultat() < 10 || a.regnUtResultat() > 20);
        return a;
    }
    
    public Regnestykke genererEnkelSubtraksjon(){
        Regnestykke a;
        ArrayList<Integer> tall = new ArrayList<Integer>();
        ArrayList<String> operator = new ArrayList<String>();
        operator.add("-");
        do{
            tall.clear();
            tall.add( randomGen.nextInt(10) );
            tall.add( randomGen.nextInt(10) );
            a = new Regnestykke(tall,operator);
        }while (a.regnUtResultat() < 0);
        return a;
    }
    
    public Regnestykke genererMiddelsSubtraksjon(){
        Regnestykke a;
        ArrayList<Integer> tall = new ArrayList<Integer>();
        ArrayList<String> operator = new ArrayList<String>();
        operator.add("-");
        do{
            tall.clear();
            tall.add( randomGen.nextInt(10)+10);
            tall.add( randomGen.nextInt(10)+5);
            a = new Regnestykke(tall,operator);
        }while (a.regnUtResultat()>9 || a.regnUtResultat() < 0);
        return a;
    }
    
    public Regnestykke genererVanskeligAddisjon(){
        Regnestykke a;
        ArrayList<Integer> tall = new ArrayList<Integer>();
        ArrayList<String> operator = new ArrayList<String>();
        operator.add("+");
        operator.add("+");
        do{
            tall.clear();
            tall.add( randomGen.nextInt(10) );
            tall.add( randomGen.nextInt(10) );
            tall.add( randomGen.nextInt(10) );
            a = new Regnestykke(tall,operator);
        }while (a.regnUtResultat() < 10 || a.regnUtResultat()>20);
        return a;
    }
    
    public Regnestykke genererVanskeligSubtraksjon(){
        Regnestykke a;
        ArrayList<Integer> tall = new ArrayList<Integer>();
        ArrayList<String> operator = new ArrayList<String>();
        operator.add("-");
        operator.add("-");
        do{
            tall.clear();
            tall.add( randomGen.nextInt(10)+10);
            tall.add( randomGen.nextInt(10)+1);
            tall.add( randomGen.nextInt(10)+5);
            a = new Regnestykke(tall,operator);
        }while (a.regnUtResultat()>10 || a.regnUtResultat() < 0);
        return a;
    }
    
    public Regnestykke genererEnkelMultiplikasjon(){
        Regnestykke a = new Regnestykke();
        a.setResultat(randomGen.nextInt(100));
        ArrayList<Integer> tall = new ArrayList<Integer>();
        ArrayList<String> operator = new ArrayList<String>();
        operator.add("*");
        do{
            if( (a.getResultat()%2) == 0){
                tall.clear();
                tall.add( randomGen.nextInt(6)+1);
                tall.add( randomGen.nextInt(7));
                a = new Regnestykke(tall,operator);
            }else if((a.getResultat()%2) != 0){
                tall.clear();
                tall.add( randomGen.nextInt(6)+1);
                tall.add( randomGen.nextInt(6)+1);
                a = new Regnestykke(tall,operator);
            }
        }while (a.regnUtResultat()>36);
        return a;
    }
    
    public Regnestykke genererMiddelsMultiplikasjon(){
        Regnestykke a = new Regnestykke();
        a.setResultat(randomGen.nextInt(100));
        ArrayList<Integer> tall = new ArrayList<Integer>();
        ArrayList<String> operator = new ArrayList<String>();
        operator.add("*");
        do{
            if( (a.getResultat()%2) == 0){
                tall.clear();
                tall.add( randomGen.nextInt(7)+1);
                tall.add( randomGen.nextInt(8));
                a = new Regnestykke(tall,operator);
            }else if((a.getResultat()%2) != 0){
                tall.clear();
                tall.add( randomGen.nextInt(7)+1);
                tall.add( randomGen.nextInt(7)+1);
                a = new Regnestykke(tall,operator);
            }
        }while (a.regnUtResultat()>100);
        return a;
    }
    
    public Regnestykke genererVanskeligMultiplikasjon(){
        Regnestykke a = new Regnestykke();
        a.setResultat(randomGen.nextInt(100));
        ArrayList<Integer> tall = new ArrayList<Integer>();
        ArrayList<String> operator = new ArrayList<String>();
        operator.add("*");
        do{
            if( (a.getResultat()%2) == 0){
                tall.clear();
                tall.add( randomGen.nextInt(7)+4);
                tall.add( randomGen.nextInt(6)+5);
                a = new Regnestykke(tall,operator);
            }else if((a.getResultat()%2) != 0){
                tall.clear();
                tall.add( randomGen.nextInt(10)+1);
                tall.add( randomGen.nextInt(6)+5);
                a = new Regnestykke(tall,operator);
            }
        }while (a.regnUtResultat()>200);
        return a;
    }
    
    public Regnestykke genererLettDivisjon(){
        int tall1;
        int tall2;
        ArrayList<Integer> tall = new ArrayList<Integer>();
        ArrayList<String> operator = new ArrayList<String>();
        operator.add("/");
        Regnestykke a;
        do{
            tall.clear();
            do{
                tall1 = (randomGen.nextInt(10)+1);
                tall2 = (randomGen.nextInt(10)+1);
            }while (tall1%tall2 != 0 );
            tall.add(tall1);
            tall.add(tall2);
            a = new Regnestykke(tall,operator);
        }while (a.regnUtResultat() == 0);
        return a;
    }
    
    public Regnestykke genererMiddelsDivisjon(){
        int tall1;
        int tall2;
        ArrayList<Integer> tall = new ArrayList<Integer>();
        ArrayList<String> operator = new ArrayList<String>();
        operator.add("/");
        Regnestykke a;
        do{
            tall.clear();
            do{
                tall1 = (randomGen.nextInt(19));
                tall2 = (randomGen.nextInt(14)+2);
            }while (tall1%tall2 != 0 );
            tall.add(tall1);
            tall.add(tall2);
            a = new Regnestykke(tall,operator);
        }while (a.regnUtResultat() > 15);
        return a;
    }
      
    public Regnestykke genererVanskeligDivisjon(){
        int tall1;
        int tall2;
        ArrayList<Integer> tall = new ArrayList<Integer>();
        ArrayList<String> operator = new ArrayList<String>();
        operator.add("/");
        Regnestykke a;
        do{
            tall.clear();
            do{
                tall1 = (randomGen.nextInt(21));
                tall2 = (randomGen.nextInt(9)+2);
            }while (tall1%tall2 != 0 );
            tall.add(tall1);
            tall.add(tall2);
            a = new Regnestykke(tall,operator);
        }while (a.regnUtResultat() > 20);
        return a;
    }
    private Regnestykke genererRandomRegnestykke(){
        int tall = randomGen.nextInt(11);
        return genererRegnestykke(tall);
    }
    
}
